//package cn.itsource.hrm.service.impl;
//
//import cn.itsource.hrm.domain.CourseType;
//import cn.itsource.hrm.mapper.CourseTypeMapper;
//import cn.itsource.hrm.service.ICourseTypeService;
//import cn.itsource.hrm.util.AjaxResult;
//import com.baomidou.mybatisplus.service.impl.ServiceImpl;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Service;
//
//import java.io.Serializable;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//
///**
// * <p>
// * 课程目录 服务实现类
// * </p>
// *
// * @author lixufeng
// * @since 2021-07-29
// */
//@Service
//public class CourseTypeServiceImpl_redis extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
//
//    @Autowired
//    private CourseTypeMapper courseTypeMapper;
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    // 缓存分类的key
//    public static final String COURSE_TYPE_CACHE_KEY = "course_type_cache_key";
//
//    /**
//     * 获取树结构
//     * @return
//     */
//    @Override
//    public AjaxResult treeData() {
//        // 先从redis获得数据 ，如果有，返回数据；如果为空，则从数据库查询数据并缓存到redis
//        List<CourseType> result = new ArrayList<>();
//        Object data = redisTemplate.opsForValue().get(COURSE_TYPE_CACHE_KEY);
//        if (data != null){
//            // 类型强转
//            result = (List<CourseType>) data;
//            System.out.println("从Redis缓存获得");
//        } else {
//            // 从数据库查询
//            result = loadTree();
//            // 缓存到Redis
//            redisTemplate.opsForValue().set(COURSE_TYPE_CACHE_KEY, result);
//            System.out.println("从数据库获得");
//        }
//
//        return AjaxResult.me().setResultObj(result);
//    }
//
//    /**
//     * 数据库中的课程分类被修改，删除，添加，
//     * Redis中的课程分类需要清空，或者重置，不然会造成缓存数据和数据库数据不一致问题
//     * @param entity
//     * @return
//     */
//    @Override
//    public boolean insert(CourseType entity) {
//        // 先清空缓存
//        redisTemplate.delete(COURSE_TYPE_CACHE_KEY);
//        return super.insert(entity);
//    }
//
//    @Override
//    public boolean deleteById(Serializable id) {
//        // 先清空缓存
//        redisTemplate.delete(COURSE_TYPE_CACHE_KEY);
//        return super.deleteById(id);
//    }
//
//    @Override
//    public boolean updateById(CourseType entity) {
//        // 先清空缓存
//        redisTemplate.delete(COURSE_TYPE_CACHE_KEY);
//        return super.updateById(entity);
//    }
//
//    private List<CourseType> loadTree() {
//        // 查出所有数据
//        List<CourseType> list = courseTypeMapper.selectList(null);
//        // 用hashMap把数据封装起来 key是courseType的id value是courseType对象
//        HashMap<Long, CourseType> map = new HashMap<>();
//        // lambda表达式 遍历数据都装到map里 建立id和courseType的关系
//        list.stream().forEach(courseType ->
//            map.put(courseType.getId(),courseType)
//        );
//        // 封装的result结果的集合
//        List<CourseType> result = new ArrayList<>();
//        // 遍历
//        list.stream().forEach(courseType -> {
//            // 找第一层级pid为0
//            if (courseType.getPid() == 0) {
//                // 把pid为0的作为第一层级添加到result
//                result.add(courseType);
//            } else {
//                // 找下一级 pid等于父级的id
//                // 根据map中的父级的id得到父级对象
//                CourseType parent = map.get(courseType.getPid());
//                // 把courseType添加到子级的属性中
//                parent.getChildren().add(courseType);
//            }
//        });
//        return result;
//    }
//}
